ReverseV2 ================= 对输入Tensor按指定维度反转。 输入: - **src** - 需反转数据的地址 - **param** - 算子计算所需参数的结构体。其各成员见下述。 - **core_mask** - 核掩码(仅共享存储版本使用)。 **ReverseParameter定义:** .. code-block:: c :linenos: typedef struct ReverseParameter { int* axis_flag_; // 用于存储需反转的轴,需反转的轴对应于数组索引的元素被置为1,其余元素为0 int* input_shape_; // 输入张量的形状 int* input_strides_; // 一个记录输入张量每一维步长的数组 int** cur_coord_; // 二维数组,每个元素存储对应核心所使用的cur_coord数组地址,这个数组用于记录当前循环到的元素坐标 int ndim_; // 输入和输出张量的维度 int axis_ndim_; // 需反转的轴的数目 int num_elem_; // 元素总数 } ReverseParameter; 输出: - **dst** - 输出地址。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 - MT7004 支持fp16, fp32, int16, int32, cplx64 **共享存储版本:** .. c:function:: void i8_reverse_s(int8_t* src, int8_t* dst, ReverseParameter* param, int core_mask) .. c:function:: void i16_reverse_s(int16_t* src, int16_t* dst, ReverseParameter* param, int core_mask) .. c:function:: void i32_reverse_s(int32_t* src, int32_t* dst, ReverseParameter* param, int core_mask) .. c:function:: void hp_reverse_s(float16* src, float16* dst, ReverseParameter* param, int core_mask) .. c:function:: void fp_reverse_s(float* src, float* dst, ReverseParameter* param, int core_mask) .. c:function:: void dp_reverse_s(double* src, double* dst, ReverseParameter* param, int core_mask) .. c:function:: void c64_reverse_s(float* src, float* dst, ReverseParameter* param, int core_mask) .. c:function:: void c128_reverse_s(double* src, double* dst, ReverseParameter* param, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 48 // MT7004 示例(共享存储多核,DDR 地址) void Resize(ReverseParameter* param, int* axis) { int i; param->input_strides_[param->ndim_ - 1] = 1; for (i = param->ndim_ - 1; i > 0; i--) { param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i]; } for (i = 0; i < param->ndim_; i++) { // initialize axis_flag array by 0 param->axis_flag_[i] = 0; } for (i = 0; i < param->axis_ndim_; i++) { param->axis_flag_[axis[i]] = 1; } param->num_elem_ = 1; for (i = 0; i < param->ndim_; i++) { param->num_elem_ *= param->input_shape_[i]; } } void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) { int core_num = GetCoreNum(core_mask); int core_id = get_core_id(); int logic_core_id = GetLogicCoreId(core_mask, core_id); float* input_data = (float*)0x88000000; float* output_data = (float*)0xA8000000; ReverseParameter* param = (ReverseParameter*)0x84000000; if (logic_core_id == 0) { int i, j; param->axis_ndim_ = axis_ndim; param->ndim_ = ndim; param->input_shape_ = (int*)0x84003000; for (i = 0; i < ndim; i++) { param->input_shape_[i] = shape[i]; } param->input_strides_ = (int*)0x84004000; param->axis_flag_ = (int*)0x84005000; param->cur_coord_ = (int**)0x84006000; for (i = 0; i < 4; i++) { param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL); for (j = 0; j < ndim; j++) { param->cur_coord_[i][j] = 0; } } Resize(param, axis); } sys_bar(0, core_num); // 初始化参数完成后进行同步 fp_reverse_s(input_data, output_data, param, core_mask); } void main(){ int shape[3] = {10, 10, 1000}; int ndim = 3; int axis[3] = {0, 1, 2}; int axis_ndim = 3; int core_mask = 0b1111; TestReverseV2(shape, ndim, axis, axis_ndim, core_mask); } **私有存储版本:** .. c:function:: void i8_reverse_p(int8_t* src, int8_t* dst, ReverseParameter* param) .. c:function:: void i16_reverse_p(int16_t* src, int16_t* dst, ReverseParameter* param) .. c:function:: void i32_reverse_p(int32_t* src, int32_t* dst, ReverseParameter* param) .. c:function:: void hp_reverse_p(float16* src, float16* dst, ReverseParameter* param) .. c:function:: void fp_reverse_p(float* src, float* dst, ReverseParameter* param) .. c:function:: void dp_reverse_p(double* src, double* dst, ReverseParameter* param) .. c:function:: void c64_reverse_p(float* src, float* dst, ReverseParameter* param) .. c:function:: void c128_reverse_p(double* src, double* dst, ReverseParameter* param) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 25 // MT7004 示例(私有存储单核,AM 地址) void TestReverseV2_p(int* shape, int ndim, int* axis, int axis_ndim) { int i, j; float* input_data = (float*)0x10000000; float* output_data = (float*)0x10020000; ReverseParameter* param = (ReverseParameter*)0x10040000; param->axis_ndim_ = axis_ndim; param->ndim_ = ndim; param->axis_flag_ = (int*)0x10041000; param->input_shape_ = (int*)0x10041400; param->input_strides_ = (int*)0x10041800; param->cur_coord_ = (int**)0x10041C00; for (i = 0; i < ndim; i++) { param->input_shape_[i] = shape[i]; } for (i = 0; i < 4; i++) { param->cur_coord_[i] = (int*)(0x10042000 + i * 0x400LL); for (j = 0; j < ndim; j++) { param->cur_coord_[i][j] = 0; } } Resize(param, axis); fp_reverse_p(input_data, output_data, param); } void main(){ int shape[3] = {4, 8, 8}; int ndim = 3; int axis[3] = {0, 1, 2}; int axis_ndim = 3; TestReverseV2_p(shape, ndim, axis, axis_ndim); }